# [Отмена действий в Git](https://nuancesprog.ru/p/7659/)

Мы всегда готовы подчеркивать бесчисленные возможности, которые предлагает Git, и эта статья не станет исключением. Git известен своей потрясающей способностью отменять практически любые действия! Наверняка на память вам уже приходят тысячи печальных случаев, когда вы делали объединение, а потом понимали, что в ваши планы оно не входило. Даже если вам кажется, что ошибочное объединение— это величайшая неудача всей вашей жизни, сделайте глубокий вдох и дочитайте статью до конца.

Не существует какого-то одного традиционного способа отмены действий в Git. Отмена производится с помощью некоторых других команд. Мы рассмотрим “первую пятерку” сценариев, которые помогут вам исправить ошибку и двинуться дальше. 

## Отмена Git Add
Один из самых распространенных вопросов в сообществе Git звучит так: “Как откатить git add перед коммитом?” Вы можете отменить действия над конкретным файлом или все внесенные изменения. 

Решение, которое потребуется для этого, весьма простое. Чтобы откатить один файл, просто вызовите команду `git reset`:

    git reset <file>
Для отмены всех изменений запустите следующее:

    git reset
Необходимость в откате становится неизбежной, если вы сделали коммит слишком рано и забыли добавить еще несколько файлов. В подобных случаях используется команда amend, чтобы внести изменения, зафиксировать их и сделать коммит снова. 

## Как откатить Git Merge
Объединение может привести к нежелаемым результатам. Но, как уже было сказано, вы можете с легкостью исправить свою ошибку! Давайте представим сценарий, в котором вы уже отправили изменения и осознали, что вам нужно отменить сделанное объединение.

Здесь на помощь приходит еще одна команда класса “отмена”: `git revert`. Начнем с того, что переключимся на мастер-ветку, используя команду `git checkout`:

    git checkout master
Следующий шаг — запустить команду git log, чтобы получить ID сделанного объединения:

    git log
Затем вернитесь к упомянутому коммиту, выполнив следующее:

    git revert -m 1 <коммит объединения>
Используя `-m 1` , вы даете Git указание: вернуться к первому родительскому элементу мастер-ветки, куда был совершен коммит объединения. Например, использование `-m 2` сказало бы Git вернуться к первому родительскому элементу ветки, откуда пришел запрос на объединение.

Git также предлагает возможность предварительного просмотра, если вы хотите увидеть, что произойдет при объединении веток. 

## Как откатить Git Reset
Предлагаем суперкороткий способ отменить команду `git reset`:

    git reset ‘HEAD@{1}’
Следом можно запустить команду `git reflog`, чтобы просмотреть журнал всех обновлений (т.е. переключение веток, сброс, коммит, объединение). 

## Отмена последних коммитов в Git
Существует несколько методов для отмены git commit. Давайте рассмотрим их по очереди.

Команду `git reset` можно использовать для отмены внесенных изменений:

    git reset — soft HEAD~x (or git reset — soft commit hash).
     
    git reset — soft HEAD~x
     
Вместо `~x` введите число. Например, если вы укажете `~4`, то команда повлияет на четвертый снизу коммит. Если вы не укажете никакое конкретно число, `git reset — soft HEAD` применится к последнему коммиту.

Когда вы используете команду `git reset — soft HEAD`, то просто отменяете последний коммит, при этом внесенные изменения останутся в вашем рабочем дереве и в вашем индексе. Поэтому `git commit` создаст в будущем коммит с теми же самыми изменениями, которые вы “обнулили” перед этим.

Другой метод — это команда `git revert HEAD~x` (`git reset — hard commit hash`), которая отменяет изменения, указанные последним коммитом в HEAD, и создает новый с возвращенными изменениями:

    git revert HEAD ~x
Этот метод лучше всего работает в случае с общими публичными репозиториями.

## Отмена Git Rebase
Допустим, вы выполнили команду `git rebase` в локальной ветке git и отправили ее в удаленную ветку. Следом вы поняли, что это не отвечает вашим ожиданиям, и захотели отменить сделанное. 

Самый простой способ  —  найти главный коммит вашей ветки, запустив команду:

    git reflog
Следом необходимо установить туда текущую ветку, воспользовавшись git reset.

    git reset — hard HEAD@{5}
В данном случае старым коммитом был HEAD5.

## Заключение
Вот и все о том, как вы можете отменить наиболее часто используемые команды в Git. Хоть никакой традиционной команды отмены и нет, другие команды git могут помочь вам откатить то, что вы могли сделать по ошибке.

Читайте также:

* <a href="https://nuancesprog.ru/p/7502/" target="_blank">Индексирование коммитов с Git Add Patch</a>
* <a href="https://nuancesprog.ru/p/7285/" target="_blank">Официальный CLI GitHub</a>
* <a href="https://nuancesprog.ru/p/7074/" target="_blank">Репозитории GitHub в помощь каждому веб-разработчику</a>
 